         ;代码清单13-1
         ;文件名：c13_mbr.asm
         ;文件说明：硬盘主引导扇区代码
         ;创建日期：2020-6-22 18:00，修改于2022-02-17 22：12

         ;设置初始的栈段和栈指针
         mov ax,cs
         mov ss,ax
         mov sp,0x7c00

         ;计算GDT所在的逻辑段地址
         mov ax,[cs:gdt_base+0x7c00]        ;低16位 
         mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位 
         mov bx,16        
         div bx            
         mov ds,ax                          ;令DS指向该段以进行操作
         mov bx,dx                          ;段内起始偏移地址 
      
         ;创建0#描述符，它是空描述符，这是处理器的要求
         mov dword [bx+0x00],0x00
         mov dword [bx+0x04],0x00  

         ;创建#1描述符，保护模式下的数据段描述符（文本模式下的显示缓冲区）
         mov dword [bx+0x08],0x8000ffff
         mov dword [bx+0x0c],0x0040920b

         ;创建#2描述符，保护模式下的代码段描述符
         mov dword [bx+0x10],0x7c0001ff
         mov dword [bx+0x14],0x00409800

         ;初始化描述符表寄存器GDTR
         mov word [cs: gdt_size+0x7c00],23  ;描述符表的界限（总字节数减一）
                                             
         lgdt [cs: gdt_size+0x7c00]
      
         in al,0x92                         ;南桥芯片内的端口 
         or al,0000_0010B
         out 0x92,al                        ;打开A20

         cli                                ;保护模式下中断机制尚未建立，应 
                                            ;禁止中断 
         mov eax,cr0
         or eax,1
         mov cr0,eax                        ;设置PE位

         ;以下进入保护模式... ...
         jmp 0000000000010_0_00B:flush      ;jmp 0x0010:flush

         bits 32

flush:
         mov cx,0000000000001_0_00B         ;加载数据段选择子(0x08)
         mov ds,cx

         ;以下在屏幕上显示"Protect mode OK."
;         mov byte [0x00],'P'
;         mov byte [0x02],'r'
;         mov byte [0x04],'o'
;         mov byte [0x06],'t'
;         mov byte [0x08],'e'
;         mov byte [0x0a],'c'
;         mov byte [0x0c],'t'
;         mov byte [0x0e],' '
;         mov byte [0x10],'m'
;         mov byte [0x12],'o'
;         mov byte [0x14],'d'
;         mov byte [0x16],'e'
;         mov byte [0x18],' '
;         mov byte [0x1a],'O'
;         mov byte [0x1c],'K'
;         mov byte [0x1e],'.'

         mov esi, msg
         mov edi, 0

show:
         mov al, [cs:esi]
         cmp al, 0
         je stop
         mov [edi], al
         inc esi
         add edi, 2
         jmp show
stop:
         hlt                                ;已经禁止中断，将不会被唤醒 

;-------------------------------------------------------------------------------
     
         gdt_size         dw 0
         gdt_base         dd 0x00007e00     ;GDT的物理地址 

         msg	          db 'Protect mode OK.     ', 0
                             
         times 510-($-$$) db 0
                          db 0x55,0xaa
